/**
 * 使用Papa Parse流式解析大型CSV文件
 */

const fs = require('fs');
const Papa = require('papaparse');

/**
 * 流式解析CSV文件
 * @param {string} filePath - CSV文件路径
 * @param {Object} options - 解析选项
 */
function parseCSVStream(filePath, options = {}) {
    return new Promise((resolve, reject) => {
        console.log(`开始解析文件: ${filePath}`);
        console.log('-'.repeat(50));

        let rowCount = 0;
        let headers = [];
        const stats = {
            totalRows: 0,
            columns: [],
            sampleData: []
        };

        // 创建可读流
        const stream = fs.createReadStream(filePath, { encoding: 'utf-8' });

        // 使用Papa Parse的流式解析
        Papa.parse(stream, {
            header: true,
            dynamicTyping: true,
            skipEmptyLines: true,
            encoding: 'utf-8',
            
            // 每解析一行就会调用这个回调
            step: function(result, parser) {
                rowCount++;

                // 获取列头
                if (rowCount === 1 && result.meta.fields) {
                    headers = result.meta.fields;
                    stats.columns = headers;
                    
                    console.log(`\n列信息 (${headers.length} 列):`);
                    headers.forEach((col, idx) => {
                        console.log(`  ${idx + 1}. ${col}`);
                    });
                    console.log('\n' + '-'.repeat(50));
                }

                // 保存前10行作为样本
                if (rowCount <= 10) {
                    stats.sampleData.push(result.data);
                }

                // 显示进度
                if (rowCount % 10000 === 0) {
                    console.log(`已处理: ${rowCount.toLocaleString()} 行`);
                }

                // 这里可以添加你的数据处理逻辑
                // 例如: 过滤、转换、聚合等
                // processRow(result.data);
            },

            // 解析完成
            complete: function(results) {
                stats.totalRows = rowCount;

                console.log('\n' + '='.repeat(50));
                console.log('解析完成!');
                console.log('='.repeat(50));
                console.log(`\n总计:`);
                console.log(`  - 总行数: ${stats.totalRows.toLocaleString()}`);
                console.log(`  - 总列数: ${stats.columns.length}`);
                console.log(`  - 错误数: ${results.errors.length}`);

                if (results.errors.length > 0) {
                    console.log(`\n前几个错误:`);
                    results.errors.slice(0, 5).forEach(err => {
                        console.log(`  行 ${err.row}: ${err.message}`);
                    });
                }

                console.log(`\n样本数据 (前5行):`);
                console.table(stats.sampleData.slice(0, 5));

                resolve(stats);
            },

            // 错误处理
            error: function(error) {
                console.error('解析错误:', error);
                reject(error);
            }
        });
    });
}

/**
 * 过滤并导出CSV数据
 * @param {string} inputPath - 输入文件路径
 * @param {string} outputPath - 输出文件路径
 * @param {Function} filterFunc - 过滤函数
 */
function filterAndExportCSV(inputPath, outputPath, filterFunc = null) {
    return new Promise((resolve, reject) => {
        console.log(`过滤并导出数据...`);
        console.log(`输入: ${inputPath}`);
        console.log(`输出: ${outputPath}`);

        let rowCount = 0;
        let filteredCount = 0;
        let headers = [];
        const filteredRows = [];

        const stream = fs.createReadStream(inputPath, { encoding: 'utf-8' });

        Papa.parse(stream, {
            header: true,
            dynamicTyping: true,
            skipEmptyLines: true,
            
            step: function(result) {
                rowCount++;

                if (rowCount === 1 && result.meta.fields) {
                    headers = result.meta.fields;
                }

                // 应用过滤函数
                if (!filterFunc || filterFunc(result.data)) {
                    filteredRows.push(result.data);
                    filteredCount++;
                }

                // 每处理1万行写入一次（避免内存溢出）
                if (filteredRows.length >= 10000) {
                    writeRowsToFile(outputPath, filteredRows, filteredCount === filteredRows.length);
                    filteredRows.length = 0; // 清空数组
                }
            },

            complete: function() {
                // 写入剩余的行
                if (filteredRows.length > 0) {
                    writeRowsToFile(outputPath, filteredRows, filteredCount === filteredRows.length);
                }

                console.log(`\n完成! 共写入 ${filteredCount.toLocaleString()} 行`);
                resolve({ totalRows: rowCount, filteredRows: filteredCount });
            },

            error: function(error) {
                console.error('过滤导出错误:', error);
                reject(error);
            }
        });
    });
}

/**
 * 写入行到文件
 */
function writeRowsToFile(filePath, rows, isFirst) {
    const csv = Papa.unparse(rows, {
        header: isFirst,
        encoding: 'utf-8'
    });

    fs.appendFileSync(filePath, csv + '\n', 'utf-8');
}

/**
 * 主函数
 */
async function main() {
    const csvFiles = [
        'output/基本设施.csv',
        'output/设施集合.csv'
    ];

    console.log('='.repeat(50));
    console.log('Papa Parse CSV 处理工具');
    console.log('='.repeat(50));

    console.log('\n可用的CSV文件:');
    csvFiles.forEach((file, idx) => {
        try {
            const stats = fs.statSync(file);
            const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
            console.log(`${idx + 1}. ${file} (${sizeMB} MB)`);
        } catch (e) {
            console.log(`${idx + 1}. ${file} (文件不存在)`);
        }
    });

    // 示例: 解析第一个文件
    console.log('\n开始处理第一个文件...\n');
    
    try {
        const stats = await parseCSVStream(csvFiles[0]);
        
        console.log('\n处理成功！');
        console.log('你可以根据需要修改 parseCsv.js 来实现自定义的数据处理逻辑。');
        
    } catch (error) {
        console.error('处理失败:', error);
    }
}

// 如果直接运行此脚本
if (require.main === module) {
    main();
}

module.exports = {
    parseCSVStream,
    filterAndExportCSV
};

